#!/bin/bash

# 设置颜色变量
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 默认分支
DEFAULT_BRANCH="main"
DEPLOY_BRANCH="${DEFAULT_BRANCH}"

# 显示使用帮助
show_help() {
    echo -e "${BLUE}AIPH 项目部署脚本${NC}"
    echo ""
    echo "使用方法:"
    echo "  ./deplay.sh                    # 部署默认分支 (${DEFAULT_BRANCH})"
    echo "  ./deplay.sh [branch_name]      # 部署指定分支"
    echo "  ./deplay.sh --help             # 显示帮助信息"
    echo ""
    echo "示例:"
    echo "  ./deplay.sh                    # 部署 main 分支"
    echo "  ./deplay.sh develop            # 部署 develop 分支"
    echo "  ./deplay.sh feature/new-ui     # 部署 feature/new-ui 分支"
    echo ""
    echo "注意事项:"
    echo "  1. 脚本会自动切换到指定分支并拉取最新代码"
    echo "  2. 如果分支不存在，脚本会尝试从远程拉取"
    echo "  3. 部署前会显示当前分支信息供确认"
}

# 解析命令行参数
parse_arguments() {
    case "${1:-}" in
        "--help" | "-h")
            show_help
            exit 0
            ;;
        "")
            # 使用默认分支
            DEPLOY_BRANCH="${DEFAULT_BRANCH}"
            ;;
        *)
            # 使用指定分支
            DEPLOY_BRANCH="$1"
            ;;
    esac
}

# 切换并拉取指定分支
checkout_and_pull_branch() {
    local branch="$1"
    
    echo -e "${GREEN}准备切换到分支: ${branch}${NC}"
    
    # 获取当前分支
    local current_branch=$(git branch --show-current 2>/dev/null || echo "unknown")
    echo -e "${YELLOW}当前分支: ${current_branch}${NC}"
    
    # 如果已经在目标分支，直接拉取
    if [ "$current_branch" = "$branch" ]; then
        echo -e "${GREEN}已在目标分支 ${branch}，直接拉取最新代码...${NC}"
        git pull origin "$branch" || { echo -e "${RED}拉取分支 ${branch} 失败，请检查！${NC}"; exit 1; }
    else
        # 检查本地是否存在该分支
        if git show-ref --verify --quiet "refs/heads/$branch"; then
            echo -e "${GREEN}切换到本地分支 ${branch}...${NC}"
            git checkout "$branch" || { echo -e "${RED}切换到分支 ${branch} 失败，请检查！${NC}"; exit 1; }
            echo -e "${GREEN}拉取分支 ${branch} 最新代码...${NC}"
            git pull origin "$branch" || { echo -e "${RED}拉取分支 ${branch} 失败，请检查！${NC}"; exit 1; }
        else
            # 尝试从远程拉取分支
            echo -e "${GREEN}本地不存在分支 ${branch}，尝试从远程拉取...${NC}"
            git fetch origin || { echo -e "${RED}获取远程分支信息失败，请检查！${NC}"; exit 1; }
            
            if git show-ref --verify --quiet "refs/remotes/origin/$branch"; then
                echo -e "${GREEN}创建并切换到分支 ${branch}...${NC}"
                git checkout -b "$branch" "origin/$branch" || { echo -e "${RED}创建分支 ${branch} 失败，请检查！${NC}"; exit 1; }
            else
                echo -e "${RED}远程分支 ${branch} 不存在，请检查分支名称！${NC}"
                echo -e "${YELLOW}可用的远程分支：${NC}"
                git branch -r | grep -v HEAD | sed 's/origin\///' | sed 's/^[ \t]*/  /'
                exit 1
            fi
        fi
    fi
    
    # 显示当前分支和最新提交信息
    echo -e "${GREEN}当前分支信息：${NC}"
    echo -e "${YELLOW}分支: $(git branch --show-current)${NC}"
    echo -e "${YELLOW}最新提交: $(git log -1 --oneline)${NC}"
    echo ""
}

# 解析参数
parse_arguments "$@"

# 打印部署信息
echo -e "${GREEN}开始部署项目...${NC}"
echo -e "${BLUE}目标分支: ${DEPLOY_BRANCH}${NC}"
echo ""

# 进入项目根目录
echo -e "${GREEN}进入项目根目录 /var/www/aiph/${NC}"
cd /var/www/aiph/ || { echo -e "${RED}目录 /var/www/aiph/ 不存在，请检查！${NC}"; exit 1; }

# 切换并拉取指定分支
checkout_and_pull_branch "$DEPLOY_BRANCH"

# 前端部署
echo -e "${GREEN}开始部署前端...${NC}"
cd /var/www/aiph/frontend/ || { echo -e "${RED}目录 /var/www/aiph/frontend/ 不存在，请检查！${NC}"; exit 1; }

# 删除前端依赖和缓存文件
echo -e "${GREEN}清理前端依赖和缓存文件...${NC}"
rm -rf node_modules package-lock.json pnpm-lock.yaml .next || { echo -e "${RED}前端依赖或缓存清理失败，请检查！${NC}"; exit 1; }

# 安装依赖
echo -e "${GREEN}安装前端依赖...${NC}"
pnpm i || { echo -e "${RED}前端依赖安装失败，请检查！${NC}"; exit 1; }

# 手动同步 .env.production 文件
cp .env.production .env || { echo -e "${RED}.env.production 文件不存在，请检查！${NC}"; exit 1; }

# 构建前端项目 - 使用 pnpm 而不是 npm，并增加内存限制
echo -e "${GREEN}构建前端项目...${NC}"
echo -e "${YELLOW}注意：构建过程可能需要较长时间，请耐心等待...${NC}"

# 设置更高的内存限制并清理内存
export NODE_OPTIONS="--max-old-space-size=8192"
# 清理系统缓存
sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches' 2>/dev/null || true

# 使用 pnpm 构建
pnpm run build || { 
    echo -e "${RED}前端构建失败，请检查！${NC}"
    echo -e "${YELLOW}可能的原因：${NC}"
    echo -e "${YELLOW}1. 内存不足 - 尝试增加服务器内存或清理其他进程${NC}"
    echo -e "${YELLOW}2. 依赖问题 - 尝试删除 node_modules 重新安装${NC}"
    echo -e "${YELLOW}3. 环境变量问题 - 检查 .env.production 文件${NC}"
    exit 1
}

# 使用 PM2 启动/重启前端项目
echo -e "${GREEN}使用 PM2 启动/重启前端项目...${NC}"
pm2 restart aipc-frontend || pm2 start npm --name "aipc-frontend" -- run start || { echo -e "${RED}PM2 启动/重启前端失败，请检查！${NC}"; exit 1; }

# 后端部署
echo -e "${GREEN}开始部署后端...${NC}"
cd /var/www/aiph/backend/ || { echo -e "${RED}目录 /var/www/aiph/backend/ 不存在，请检查！${NC}"; exit 1; }

# 清理旧的依赖
echo -e "${GREEN}清理旧的依赖...${NC}"
rm -rf node_modules package-lock.json || { echo -e "${RED}清理旧的依赖失败，请检查！${NC}"; exit 1; }

# 安装依赖
echo -e "${GREEN}安装后端依赖...${NC}"
pnpm i || { echo -e "${RED}后端依赖安装失败，请检查！${NC}"; exit 1; }

# 生成 Prisma 客户端
echo -e "${GREEN}使用 .env.production 作为环境变量...${NC}"
cp .env.production .env || { echo -e "${RED}.env.production 文件不存在，请检查！${NC}"; exit 1; }

echo -e "${GREEN}生成 Prisma 客户端...${NC}"
npx prisma generate || { echo -e "${RED}生成 Prisma 客户端失败，请检查！${NC}"; exit 1; }

# 运行数据库迁移
echo -e "${GREEN}运行数据库迁移...${NC}"
npx prisma migrate deploy || { echo -e "${RED}数据库迁移失败，请检查！${NC}"; exit 1; }

# 手动同步 .env.production 文件
cp .env.production .env || { echo -e "${RED}.env.production 文件不存在，请检查！${NC}"; exit 1; }

# 构建后端项目
echo -e "${GREEN}构建后端项目...${NC}"
pnpm run build || { echo -e "${RED}后端构建失败，请检查！${NC}"; exit 1; }

# 使用 PM2 启动/重启后端项目
echo -e "${GREEN}使用 PM2 启动/重启后端项目...${NC}"
pm2 restart aipc-backend || pm2 start ./dist/src/index.js --name "aipc-backend" || { echo -e "${RED}PM2 启动/重启后端失败，请检查！${NC}"; exit 1; }

# 完成部署
echo -e "${GREEN}项目部署完成！${NC}"